package cn.tedu.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * @Author 金帮嘉诚
 * @Date 2021-06-10 周四 16:19
 */
/*本类用于测试异常的入门案例*/
public class ExceptionDemo {
    public static void main(String[] args){
        //输入3.5 报错 InputMismatchException--输入不匹配
        //输入17和0 报错 ArithmeticException: / by zero--算数异常，除数不能为0是数学规定
        /*1.不要害怕BUG，真正的勇士敢于直面自己写的BUG*/
        /*2.学会看报错的信息提示，确定自己的错误方向*/
        /*3.学会看报错的行号信息确定自己报错的位置，哪里不对点哪里
         * 注意：源码不会错，我们要看的是自己的代码*/
//        method1();//调用method()--人为暴露异常--看看异常长啥样
//        method2();//调用method2方法--异常解决方案1--捕获处理
//          method3();//调用method3方法--异常解决方案2--交给调用者来解决
        f();//为了写一个标准的写法，在main方法调用之前，处理掉异常
    }

    private static void f() {
        try {
            method3();
        }catch (Exception e){
            System.out.println("请输入正确的数据");
        }
    }
    /*如果一个方法抛出了异常，那么谁调用这个方法，谁就需要处理这个异常
    * 这楼里的处理也有两种方案：捕获解决和继续向上抛出
    * 但是注意：我们一般会在main方法调用之前解决掉异常
    * 而不是把问题抛给main，因为没人解决了，详见本类f方法调用method3方法
    * */

    //6.创建method3，异常解决方案2
    /*异常抛出的格式：在小括号与大括号之间写：throws异常类型
    * 如果有多个异常，使用逗号分隔开即可
    * */
    private static void method3()throws Exception{//抛出给main方法再让main方法抛出异常
//            throws InputMismatchException,ArithmeticException{
        System.out.println("请输入您要计算的第一个整数");
        int a = new Scanner(System.in).nextInt();

        System.out.println("请输入您要计算的第二个整数");
        int b = new Scanner(System.in).nextInt();
        //.直接打印这两个数除法的结果
        System.out.println("a/b = " + a / b);

    }

    /*异常捕获处理的格式：
     *try{
     *   可能会抛出异常的代码
     *}catch(异常类型 异常的名字){
     *   匹配到了错误进行处理的解决方案
     * }
     *
     * */
    //创建方法用来捕获处理异常--自己处理
    private static void method2() {
        //5.按照捕获处理的语法提供异常解决方案
        /**先写结构再写代码 提前布局*/
        /*4.try中放着的是可能会出现异常的代码*/
        /*5.如果发生了异常会被catch捕获，执行之前catch中提供的解决方案*/
        while (true) {
            try {
                //5.2复写一下刚刚的代码
                System.out.println("请输入您要计算的第一个整数");
                int a = new Scanner(System.in).nextInt();

                System.out.println("请输入您要计算的第二个整数");
                int b = new Scanner(System.in).nextInt();
                //.直接打印这两个数除法的结果
                System.out.println("a/b = " + a / b);
                break;
                //5.3捕获处理异常
            } catch (InputMismatchException e) {//注意要导包
                System.out.println("请输入规定的整数类型");
            } catch (ArithmeticException e) {
                System.out.println("除数不能为0是我们的错，请再输一次");
            }catch (Exception e){
                System.out.println("输入不合法，请重新输入");
            }
        }
        /*6.try-catch可以嵌套，如果有多种异常类型需要特殊处理的话*/
        /*7.这就是多态最为经典的一种用法，我们并不关心子类的具体类型
        * 而是将所有子类统一当作父类类型来处理，提供通用的解决方案*/
    }

    private static void method1() {
        //1.提示并接收用户输入的第一个数
        System.out.println("请输入您要计算的第一个整数");
        int a = new Scanner(System.in).nextInt();
        //2.
        System.out.println("请输入您要计算的第二个整数");
        int b = new Scanner(System.in).nextInt();
        //3.直接打印这两个数除法的结果
        System.out.println("a/b = " + a / b);

    }
}
